#define _GUN_SOURCE
#include "daemon_runner.h"
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include "daemon_sub_process.h"
#include "log.h"
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <string.h>
#include <sys/reboot.h>

static int is_running = 1;
static sub_process_t *sub_process_list[SUB_PROCESS_COUNT];
static void daemon_runner_stop()
{
    is_running = 0;
}

int daemon_runner_start()
{
    // 设定 守护进程 变为后台进程
    daemon(0,1); // 0 把程序主目录改成 '/' 参数2 如果是0 则会关闭输入输出和错误
    // 设定日志信息的输出
    // 重定向 关闭 3个文件描述符 打开新的日志文件   占用对应的文件描述符
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);

    open("/dev/null",O_RDWR);
    open(LOG_FILE,O_CREAT | O_RDWR | O_APPEND,0644);
    open(LOG_FILE,O_CREAT | O_RDWR | O_APPEND,0644);
    // 注册停止信号 kill
    signal(SIGTERM,daemon_runner_stop);
    // 初始化子进程 app ota
    sub_process_t *sub_process_ota = daemon_sub_process_init("ota");
    sub_process_t *sub_process_app = daemon_sub_process_init("app");

    sub_process_list[0] = sub_process_ota;
    sub_process_list[1] = sub_process_app;
    // 周期检测或启动子进程
    log_info("daemon runner start");
    while(is_running)
    {
        for (size_t i = 0; i < SUB_PROCESS_COUNT; i++)
        {
            daemon_sub_process_check_and_start(sub_process_list[i]);
        }
        sleep(2);
    }
    // 如果退出循环 逐个结束子进程
    for (size_t i = 0; i < SUB_PROCESS_COUNT; i++)
    {
        daemon_sub_process_stop(sub_process_list[i]);
    }
    return 0;
}